**makepkg** - это базовая утилита для сборки собственных пакетов, которые могут быть использованы менеджером **pacman**. Основанный на скриптовой системе сборки пакетов, makepkg способен загрузить из интернета и проверить на целостность исходники (например архивы tar.gz и bz2), установить параметры сборки пакета (т.к флаги CFLAGS и другие параметры компилятора), собрать пакет во временную папку и создать готовый архив соответствующий стандарту Arch, удалив все ненужное.

## Contents

*   [1 Установка и настройка](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D0.B8_.D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0)
    *   [1.1 ABS - Система автоматической сборки пакетов Arch](#ABS_-_.D0.A1.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.D0.B0.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B9_.D1.81.D0.B1.D0.BE.D1.80.D0.BA.D0.B8_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2_Arch)
*   [2 Makepkg](#Makepkg)
*   [3 Сборка пакета](#.D0.A1.D0.B1.D0.BE.D1.80.D0.BA.D0.B0_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.B0)
    *   [3.1 Настройка: архитектура и флаги компиляции](#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0:_.D0.B0.D1.80.D1.85.D0.B8.D1.82.D0.B5.D0.BA.D1.82.D1.83.D1.80.D0.B0_.D0.B8_.D1.84.D0.BB.D0.B0.D0.B3.D0.B8_.D0.BA.D0.BE.D0.BC.D0.BF.D0.B8.D0.BB.D1.8F.D1.86.D0.B8.D0.B8)
        *   [3.1.1 Опция MAKEFLAGS](#.D0.9E.D0.BF.D1.86.D0.B8.D1.8F_MAKEFLAGS)
*   [4 Установка через скрипты сборки](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_.D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D1.8B_.D1.81.D0.B1.D0.BE.D1.80.D0.BA.D0.B8)
*   [5 Полезные ссылки](#.D0.9F.D0.BE.D0.BB.D0.B5.D0.B7.D0.BD.D1.8B.D0.B5_.D1.81.D1.81.D1.8B.D0.BB.D0.BA.D0.B8)

## Установка и настройка

### ABS - Система автоматической сборки пакетов Arch

Для начала, убедитесь что у вас установлены утилиты для сборки собственных пакетов, в их список входят: компилятор, линкер, некоторые базовые библиотеки и вспомогательные приложения типа automake и autoconf. Чтобы загрузить и установить их последние версии, наберите в командной строке эти команды с привилегиями **root**-пользователя:

```
# pacman -S base-devel
# pacman -S abs

```

Впишите **Y** для всех вопросов и pacman закачает и установит (или обновит) средства необходимые для создания собственных пакетов. Затем, опять-же с привилегиями **root**-пользователя, выполните:

```
# abs

```

Этот скрипт подсоединится к ближайшему серверу, закачает и установит дерево ABS в каталог **/var/abs**. По умолчанию, некоторые репозитории отключены, вы можете установить свои настройки редактируя файл **/etc/abs.conf**

Теперь необходимо создать папку в которой будут содержаться исходники, скрипты, патчи или прочие файлы для будущего пакета. Папку можно создать, например, в корне вашего домашнего каталога:

```
$ mkdir ~/abs

```

## Makepkg

Если вы хотите иметь возможность устанавливать недостающие для сборки пакета зависимости, установите утилиту **sudo** и добавьте вашего пользователя в файл настройки утилиты: **/etc/sudoers**.

*ЗАМЕТКА:* в состав пакета sudo входит утилита **visudo** которая запускает редактор **vi** в особом режиме, позволяющем сразу-же отредактировать файл без изменения прав доступа.

```
USER_NAME    ALL=(ALL)    NOPASSWD: /usr/bin/pacman

```

Добавив эту строку и заменив USER_NAME именем вашего пользователя, у вас появится возможность запускать pacman без необходимости ввода пароля.

Следующий шаг - это определения папки в которой будут перемещены "свежесобранные" пакеты, например вы можете назначить здесь папку в вашем домашнем каталоге. Если этот параметр не был установлен, то пакеты будут расположены в той-же папке откуда был запущен makepkg.

Например, создайте такую папку:

```
$ mkdir /home/$USER/packages

```

и установите переменную **PKGDEST** в файле **/etc/makepkg.conf** соотвествующим образом.

Пока вы редактируете его, можете посмотреть на другие переменные влияющие на сборку ваших пакетов. Например вы можете установить переменную **PACKAGER**, при этом ваше имя будет добавлено к собранным пакетам, либо убрать **!** перед параметром **docs** в массиве **OPTIONS**, в случае если вы не хотите чтобы makepkg удалял папку с документацией к вашему пакету. Просмотрите статью [Makepkg.conf](/index.php/Makepkg.conf "Makepkg.conf") для подробной информации по возможным параметрам.

## Сборка пакета

Для сборки пакета вы можете создать собственный "с нуля" следуя указаниям [Руководства по сборке пакетов Arch](/index.php/Creating_packages_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Creating packages (Русский)"), либо, если кто-то уже сделал это за вас, поискать на странице [AUR](https://aur.archlinux.org/) или в дереве [ABS](/index.php/ABS "ABS").

Например, вы нашли какой-то очень интересующий вас пакет в AUR и хотите собрать его и установить (в этом примере будет приведен **rufus**, клиент bittorrent основанный на Python). Вы можете достать **PKGBUILD** и все необходимые для сборки файлы (в некоторых случаях это патчи или дополнительные скрипты) нажав на ссылку "Tarball" или "Архив", для пользователей просматривающих страницу на русском языке.

```
$ cd /path/to/tarball
$ tar -zxf rufus.tar.gz
$ cd rufus

```

Обратите внимание на то, что в папке rufus появились несколько файлов, один из них называется PKGBUILD, именно он и содержит инструкции для сборки пакета. Для сборки пакета введите (под управлением вашего пользователя) команду:

```
$ makepkg

```

Утилита загрузит все необходимые для сборки исходники и попытается собрать пакет. Если не хватает каких-то зависимостей, makepkg сообщит об этом прежде чем завершить работу с ошибкой. Если вы хотите собрать пакет и дать возможность makepkg самому загрузить и установить необходимые зависимости, то введите эту команду:

```
$ makepkg -s

```

Обратите внимание, что зависимости должны быть доступны в заранее настроенных вами репозитариях. С другой стороны, вы можете собственноручно установить их командой

```
$ sudo pacman -S dep1 dep2 depN

```

После того как все необходимые зависимости были установлены и ваш пакет был собран удачно, у вас появится файл **rufus-0.7.0-1.pkg.tar.gz**. Вы можете установить его командой

```
$ sudo pacman -U rufus-0.7.0-1.pkg.tar.gz

```

### Настройка: архитектура и флаги компиляции

Основные настройки makepkg находятся в файле `/etc/makepkg.conf`.

Опции `MAKEFLAGS`, `CFLAGS` и `CXXFLAGS` используются программами [make](https://www.archlinux.org/packages/?name=make), [gcc](https://www.archlinux.org/packages/?name=gcc) и `g++` во время компиляции программ через makepkg. По умолчанию, эти опции направлена на генерацию «обычных» (generic) пакетов, которые могут устанавливаться и работать на различных аппаратных конфигурациях. Тонкой настройкой опций компиляции может быть достигнут прирост производительности на конкретной машине. Но пакет, скомпилированный под конкретный процессор, может не работать на других машинах.

**Примечание:** Не все пакеты и/или системы сборки пакетов будут использовать эти опции компиляции. Иногда опции задаются жёстко в настройках оригинальных Makefiles или в [PKGBUILD](/index.php/PKGBUILD_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "PKGBUILD (Русский)").
 `/etc/makepkg.conf` 
```
...

#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"

#-- Exclusive: will only run on x86_64
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"

...

```

Изначальные опции `CFLAGS` and `CXXFLAGS` файла makepkg.conf совместимы с любой машиной соответствующей архитектуры.

Начиная с версии 4.3.0, GCC содержит настройку `-march=native`, которая включает автонастройку под конкретный процессор и автоматически включает соответствующие оптимизации при сборке. Чтобы использовать эту настройку, измените начальные опции `CFLAGS` и `CXXFLAGS` следующим образом:

```
# -march=native also sets the correct -mtune=
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"

```

Посмотрите [gcc(1)](https://jlk.fjfi.cvut.cz/arch/manpages/man/gcc.1) для полного списка доступных опций. Дополнительную информацию можно найти в вики проекта Gentoo: [Compilation Optimization Guide](http://www.gentoo.org/doc/en/gcc-optimization.xml) и [Safe Cflags](http://wiki.gentoo.org/wiki/Safe_CFLAGS).

#### Опция MAKEFLAGS

Опция `MAKEFLAGS` используется для дополнительной настройки процесса сборки. Владельцы многоядерных или многопроцессорных систем могут определить количество одновременных потоков компиляции. Для того чтобы узнать количество доступных процессоров, выполните команду `nproc`. Например, если вывод команды `nproc` будет 4, то при компиляции используйте `-j4`. Некоторые [PKGBUILD](/index.php/PKGBUILD_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "PKGBUILD (Русский)")'ы специально обходят эту настройку своей опцией `-j1` из-за ограничений конкретной программы, или просто потому, что изначально эта опция не поддерживалась, а впоследствии её забыли убрать. Иногда из-за этого сборка может кончиться неудачей, пожалуйста, [сообщайте](/index.php/Reporting_bug_guidelines_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Reporting bug guidelines (Русский)") о таких случаях на баг-трекер, но сначала убедитесь, что дело именно в использовании ваших MAKEFLAGS.

Смотрите [make(1)](https://jlk.fjfi.cvut.cz/arch/manpages/man/make.1) для полного списка доступных опций.

## Установка через скрипты сборки

Иногда со сторонних репозитариев вы можете обнаружить только файлы типа *.pkgbuild. В этом случае добавьте параметр **-p** к makepkg указав имя нужного вам сборочного скрипта:

```
$ makepkg -p <buildscript>

```

Поздравляем! Теперь вы успешно собрали и установили ваш собственный пакет!

## Полезные ссылки

*   [Полезное руководство по makepkg/ABS](https://bbs.archlinux.org/viewtopic.php?t=1590)
*   [Руководство по созданию пакетов Arch](/index.php/Creating_packages_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Creating packages (Русский)")
*   [AUR](https://aur.archlinux.org)
*   [Страница man для makepkg](https://www.archlinux.org/pacman/makepkg.8.html)
*   [Напутствия по созданию PKGBUILD-скриптов в Arch CVS & SVN](/index.php/Arch_CVS_%26_SVN_PKGBUILD_guidelines "Arch CVS & SVN PKGBUILD guidelines")
*   [Makepkg.conf](/index.php/Makepkg.conf "Makepkg.conf")